/*
package com.itheima.reggie.aop;

import com.itheima.reggie.common.GlobalThread;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.LocalDateTime;

*/
/**
 * @author mff
 * @date 2022/6/9 9:20
 * @mood happy
 *//*


// 使用aop来实现公共字段自动填充的功能
@Slf4j
*/
/*@Aspect
@Component  //被spring容器扫到、管理*//*

public class CommonAdvice {
    //    切点表达式
    @Pointcut("execution(* com.itheima.reggie.controller.*Controller.save*(..)) || execution(* com.itheima.reggie.controller.*Controller.update*(..))")
    private void pt() {}


    //      通知
    @Around("pt()")
    public Object modifyColumn(ProceedingJoinPoint pjp) {
        Long id = GlobalThread.getThread();
//           获得切点的参数（规定好第一个为employee对象）
        Object proceed = null;
        Object[] args = pjp.getArgs();
        Object arg = args[0];  //Employee、category...
//        获得到对象后，使用反射技术获得到该对象的方法，并执行方法
        Class<?> aClass = arg.getClass();
//        获得切点的方法名
        String name = pjp.getSignature().getName();
//        设置对象
        try {

            if (name.startsWith("save")) {
                log.info("添加操作，自动加入CreateTime、CreateUser");
                Method setCreateTime = aClass.getMethod("setCreateTime", LocalDateTime.class);
//                arg这个对象调用setCreatTime()方法，并赋值，则这个对象中的属性值会改变
                setCreateTime.invoke(arg, LocalDateTime.now());
                Method setCreateUser = aClass.getMethod("setCreateUser", Long.class);
                setCreateUser.invoke(arg, id);
            }
            log.info("添加、更新操作，自动加入UpdateTime、UpdateUser");
            Method setUpdateTime = aClass.getMethod("setUpdateTime", LocalDateTime.class);
            setUpdateTime.invoke(arg, LocalDateTime.now());
            Method setUpdateUser = aClass.getMethod("setUpdateUser", Long.class);
            setUpdateUser.invoke(arg, id);
//            用当前修改过后的args参数调用切点的方法，并获得返回值
            proceed = pjp.proceed(args);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
//       需要提升作用域，返回值就是R<>
        return proceed;
    }
}
*/
